package ch06.shizhang.shizhang01;

import ch06.shili.shili01.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * @author 茜茜
 * @date 2024-11-22 15:17
 */
public class GetPersonClassInfo {
    public static void main(String[] args) {
        /**
         *
         */
        Class clz = Person.class;//获取class实例
        String className = clz.getName();  //获取class的包名+类名
        String simpleClassName = clz.getSimpleName();  //获取类名
        Package pkg = clz.getPackage(); //获取包类
        //父类
        Class superClass = clz.getSuperclass();


        System.out.println("以下是 " + className + "类的基本信息:");
        System.out.println("类名：" + simpleClassName);
        System.out.println("定义在：" + pkg.getName() + " 包中");
        System.out.println(simpleClassName + "类的父类是" + superClass.getSimpleName());

        //获取clz实现的接口
        Class[] interfaces = clz.getInterfaces();
        System.out.println(simpleClassName + "类所实现的接口：");
        for (Class c : interfaces) {
            System.out.print("\t" + c.getName());
        }

        //获取修饰符
        int modifierP = clz.getModifiers();
        System.out.print(simpleClassName + "类的修饰符：");
        if ((modifierP & Modifier.PUBLIC) == Modifier.PUBLIC) {
            System.out.println("\tpublic");
        } else if ((modifierP & Modifier.FINAL) == Modifier.FINAL) {
            System.out.println("\tfinal");
        } else if ((modifierP & Modifier.ABSTRACT) == Modifier.ABSTRACT) {
            System.out.println("\tabstract");
        } else if ((modifierP & Modifier.PROTECTED) == Modifier.PROTECTED) {
            System.out.println("\tprotected");
        } else if ((modifierP & Modifier.PRIVATE) == Modifier.PRIVATE) {
            System.out.println("\tprivate");
        } else {
            System.out.println("\tdefault(package)");
        }
        System.out.println();

        /**
         * 构造方法信息
         */
        //获取Person类声明的所有构造方法
        Constructor[] constructors = Person.class.getDeclaredConstructors();

        //构造方法的一些信息
        System.out.print("以下是 " + simpleClassName + "类的构造方法基本信息:");
        for (Constructor con : constructors) {
            System.out.print("访问修饰符：");
            int modifierCon = con.getModifiers();
            if ((modifierCon & Modifier.PUBLIC) == Modifier.PUBLIC) {
                System.out.println("public");
            } else if ((modifierCon & Modifier.PROTECTED) == Modifier.PROTECTED) {
                System.out.println("protected");
            } else if ((modifierCon & Modifier.PRIVATE) == Modifier.PRIVATE) {
                System.out.println("private");
            } else {
                System.out.println("default(package)");
            }

            //获取构造方法的参数列表
            Class[] parameterTypes = con.getParameterTypes();
            if (parameterTypes.length == 0) {
                System.out.println("该构造方法没有参数");
            } else {
                System.out.println("该构造方法的参数列表：[");
                for (int i = 0; i < parameterTypes.length; i++) {
                    if (i != 0) {
                        System.out.print(parameterTypes[i].getName());
                        System.out.print(",");
                    }
                }
            }
        }
        System.out.println();

        /**
         * 属性信息
         */
        System.out.println("以下是 " + simpleClassName + "类的属性的基本信息:");
        //获取Person类中的所有属性
        Field[] fields = Person.class.getDeclaredFields();
        for (Field field : fields) {
            System.out.println("属性名：" + field.getName());
            System.out.println("类型：" + field.getType().getName());
            System.out.print("访问修饰符：");
            int modifier = field.getModifiers();
            if ((modifier & Modifier.PUBLIC) == Modifier.PUBLIC) {
                System.out.println("public");
            } else if ((modifier & Modifier.PROTECTED) == Modifier.PROTECTED) {
                System.out.println("protected");
            } else if ((modifier & Modifier.PRIVATE) == Modifier.PRIVATE) {
                System.out.println("private");
            } else {
                System.out.println("default(package)");
            }
            // 判断该属性是否有static修饰符
            if ((modifier & Modifier.STATIC) == Modifier.STATIC) {
                System.out.println("这是一个静态属性");
            }
            // 判断该属性是否有final修饰符
            if ((modifier & Modifier.FINAL) == Modifier.FINAL) {
                System.out.println("这是一个final属性");
            }
        }
        System.out.println();
    }
}
